Skip to main content

第18章 字符图形

字符图形使用*#、空格等字符,依靠循环嵌套打印行列图案,是嵌套循环经典练习题。

18.1 核心设计思路

  1. 外层for:控制一共多少行;
  2. 内层循环1:打印每行前置空格(控制缩进、对称);
  3. 内层循环2:打印图形字符(*);
  4. 每行打印完毕执行换行cout << endl;

18.2 基础图形代码示例

18.2.1 实心矩形

每行字符数量相同

#include <iostream>
using namespace std;
int main()
{
int row = 4, col = 6;
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
cout << "*";
cout << endl;
}
return 0;
}

18.2.2 右下直角三角形

第i行有i个星

int main()
{
int n = 5;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= i; j++)
cout << "*";
cout << endl;
}
return 0;
}

18.2.3 等腰三角形

每行先打印空格,再打印奇数个*

int main()
{
int n = 5;
for(int i = 0; i < n; i++)
{
// 前置空格
for(int j = 0; j < n - 1 - i; j++)
cout << " ";
// 打印星号 2*i+1个
for(int k = 0; k < 2*i + 1; k++)
cout << "*";
cout << endl;
}
return 0;
}

18.2.4 菱形

上半部分递增等腰三角 + 下半部分递减等腰三角

int main()
{
int n = 5;
int half = (n + 1) / 2;
// 上半部分
for(int i = 1; i <= half; i++)
{
for(int j = 1; j <= half - i; j++) cout << " ";
for(int k = 1; k <= 2*i - 1; k++) cout << "*";
cout << endl;
}
// 下半部分
for(int i = half - 1; i >= 1; i--)
{
for(int j = 1; j <= half - i; j++) cout << " ";
for(int k = 1; k <= 2*i - 1; k++) cout << "*";
cout << endl;
}
return 0;
}

18.2.5 空心矩形

判断边界位置打印#,内部打印空格

int main()
{
int r = 4, c = 6;
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
if(i == 0 || i == r-1 || j == 0 || j == c-1)
cout << "#";
else
cout << " ";
}
cout << endl;
}
return 0;
}

18.3 绘图通用技巧

  1. 先手动写出前几行,找出空格、星号与行号的数学关系;
  2. 复杂图形拆分成上下两部分分别循环;
  3. 使用变量统一控制行数,方便修改大小;
  4. 空心图形依靠if判断边框位置;
  5. 严格每行结束换行,否则全部挤在同一行。

18.4 易错点

  1. 循环边界写错,多/少打印一行一列;
  2. 忘记打印前置空格,图形不对称;
  3. 内层、外层循环变量重名(都用i)造成逻辑混乱;
  4. 空心图形判断条件漏写某一边框。